/**
 * @link https://es6.ruanyifeng.com/#docs/function
 */

/**
 * 1. 函数参数默认值
 */
function foo1(x = 'apple') {
  console.log(x)
}

let x = 100
function foo2(p = x + 10) {
  console.log(p)
}

function foo3(a, b, x = '10') {}
console.log(foo3.length) // 输出：2。长度为没有默认值参数的个数

/**
 * 2. 与解构赋值默认值结合使用
 */
function foo({ x, y = 5 }) {
  console.log(x, y)
}
foo({}) // undefined 5
foo({ x: 1 }) // 1, 5
foo({ x: 1, y: 2 }) // 1, 2
foo() // TypeError: Cannot read property 'x' of undefined

function fetch(url, { body = '', method = 'GET', headers = {} }) {
  console.log(method)
}
fetch('http://example.com', {}) // GET
/**
 * 1. 如果函数fetch的第二个参数是个对象，就可以为他的三个属性设置默认值。
 * 2. 这种写法不能省略第二个参数，如果结合函数参数的默认值就可以省略第二个参数，
 * 3. 这时就出现了双重默认值
 */
fetch('http://example.com') // 报错。

function fetch2(url, { body = '', method = 'GET', headers = {} } = {}) {
  console.log(method)
}
fetch2('http://example.com')

// 还可以这样写
function m1({ x = 0, y = 0 } = {}) {
  return [x, y]
}
function m2({ x, y } = { x: 1, y: 2 }) {
  return [x, y]
}
